﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpPickInterface.h"
#include "IPickContext.h"

namespace gcmp {

    class IPickFilter;
    class IPickEvent;
    class Vector3d;
    class ILine3d;
    class Coordinate3d;
    class IPolygon;
    class PickTarget;
    class ViewerContext;
    class IModelView;
    class IGraphicsNodeReference;

    /// \brief 按多边形拾取上下文，是多边形拾取的输入信息
    class GCMP_PICK_INTERFACE_EXPORT IPolygonPickContext : public IPickContext
    {
        DEFINE_CAST_DERIVED(gcmp::IPolygonPickContext, gcmp::IPickContext);
    public:
        /// \brief 产生默认的按多边形拾取上下文
        /// \return 按多边形拾取上下文
        static OwnerPtr<IPolygonPickContext> Create();

        /// \brief 设置拾取多边形的顶点信息
        ///
        /// \param polygonVertexes 用于拾取的多边形的所有顶点
        /// \return 成功返回true，失败返回false
        virtual bool SetPolygonVertexes(std::vector<Vector3d>& polygonVertexes) = 0;

        /// \brief 设置拾取射线
        ///
        /// 拾取射线的位置在拾取多边形的中心处，其与多边形所在平面垂直
        /// \param ray 拾取射线
        /// \return 成功返回true，失败返回false
        virtual bool SetRay(const ILine3d* ray) = 0;

        /// \brief 设置拾取多边形所在局部坐标系
        ///
        /// \param coordinate3d 拾取多边形所在平面的坐标系
        /// \return 成功返回true，失败返回false
        virtual bool SetCoordinate3d(const Coordinate3d& coordinate3d) = 0;

        /// \brief 设置是否按反选拾取
        /// \param isReversePick true表示反选，false表示正选，默认为false
        /// \return 成功返回true，失败返回false
        virtual bool SetReversePick(bool isReversePick) = 0;

        /// \brief 设置拾取滤波器
        ///
        /// \param pPickFilter 拾取过滤器
        /// \return 成功返回true，失败返回false
        virtual bool SetPickFilter(const IPickFilter* pPickFilter) = 0;

        /// \brief 设置拾取后处理事件,用于对拾取结果进行后处理
        /// 
        /// \param pPickEvent 拾取后处理事件
        /// \return 成功返回true，失败返回false
        virtual bool SetPickPostProcessEvent(const IPickEvent* pPickEvent) = 0;

        /// \brief 获取拾取多边形
        ///
        /// \return 返回拾取多边形
        virtual const IPolygon* GetPolygon() const { return nullptr; }

        /// \brief 获取拾取多边形所在平面的坐标系
        ///
        /// \return 拾取多边形所在平面的坐标系
        virtual const Coordinate3d& GetCoordinate3d() const = 0;

        /// \brief 获取正选还是反选
        ///
        /// \return 反选返回true，正选返回false
        virtual bool GetReversePick() const = 0;

        /// \brief 获取当前文档指针
        ///
        /// \return 返回当前文档指针
        virtual const IDocument* GetDocument() const = 0;

        /// \brief 获取当前视图指针
        ///
        /// \return 返回当前视图指针
        virtual const IModelView* GetModelView() const = 0;

        /// \brief 获取拾取目标设置
        ///
        /// \return 返回拾取目标设置
        virtual const PickTarget& GetPickTarget() const = 0;

        /// \brief 获取视图上下文信息
        ///
        /// \return 返回视图上下文信息
        virtual const ViewerContext& GetViewerContext() const = 0;

        /// \brief 是否可以按面内部拾取
        ///
        /// \return 成功返回true，失败返回false
        virtual bool IsSelectByFaceInteriorEnabled() const = 0;

        /// \brief 是否允许拾取该图形节点
        ///
        /// \param graphicsNodeReference 图形节点的引用
        /// \return 成功返回true，失败返回false
        virtual bool AllowGNode(const IGraphicsNodeReference& nodeReference) const = 0;

        /// \brief 是否允许拾取此元素的图形表达及其子节点
        ///
        /// \param elementId 元素Id
        /// \return 成功返回true，失败返回false
        virtual bool AllowElement(const ElementId& elemId) const = 0;
    };

}
